#pragma once

#ifndef __DRIVER_NONE_HH__
#define __DRIVER_NONE_HH__

#include <unordered_map>

#include "driver/abstract_interface.hh"
#include "msctrl/hil/hil.hh"

namespace Standalone::Driver::None {

class NoneInterface : public AbstractInterface, MsCtrl::Interface {
 private:
  MsCtrl::HIL::HIL *pHIL;

  MsCtrl::Event completionEvent;

  uint32_t lpnSize;

  void complete(uint64_t, uint64_t);

 public:
  NoneInterface(ObjectData &, MsCtrl::MsCtrl &);
  ~NoneInterface();

  // AbstractInterface
  void initialize(IGL::BlockIOLayer *p, Event) override;
  void getSSDInfo(uint64_t &, uint32_t &) override;

  void submit(Request &) override;

  // MsCtrl::Interface
  void read(uint64_t, uint32_t, uint8_t *, MsCtrl::Event,
            uint64_t = 0) override;
  void write(uint64_t, uint32_t, uint8_t *, MsCtrl::Event,
             uint64_t = 0) override;

  void postInterrupt(uint16_t, bool) override;
  void getPCIID(uint16_t &, uint16_t &) override;

  void getStatList(std::vector<MsCtrl::Stat> &) override;
  void getStatValues(std::vector<double> &) override;
};

}  // namespace Standalone::Driver::None

#endif
